package com.wk.common;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

@Aspect //切面注解
@Component //将当前类注入到Spring容器中
public class LogAspect {

    //切入点，其中execution用于使用切面的连接点。使用方法：execution(方法修饰符（可选）返回类型 方法名 参数 异常模式（可选）），可使用通配符匹配字符，*可以匹配任意字符
    @Pointcut("execution(public * com.wk.controller.*.*(..))")
    public void LogAspect(){}

    @Before("LogAspect()")  //在方法前执行
    public void doBefore(JoinPoint joinPoint)
    {
        System.out.println("doBefore");
    }

    @After("LogAspect()")  //在方法后执行
    public void doAfter(JoinPoint joinPoint)
    {
        System.out.println("doAfter");
    }

    @AfterReturning("LogAspect()")  //在方法执行后返回一个结果后执行
    public void doAfterReturning(JoinPoint joinPoint)
    {
        System.out.println("doAfterReturning");
    }

    @AfterThrowing("LogAspect()")  //在方法执行过程中抛出异常时执行
    public void deAfterThrowing(JoinPoint joinPoint){
        System.out.println("deAfterThrowing");
    }

    /**------上面四个方法可以使用JoinPoint，JoinPoint包含类名、被切面的方法名，参数等信息**/


    @Around("LogAspect()")  //环绕通知，是在执行前后都使用，这个方法的参数必须为ProceedingJoinPoint，proceed()方法就是被切面的方法，
    public Object deAround(ProceedingJoinPoint joinPoint) throws Throwable{
        System.out.println("deAround");
        return joinPoint.proceed();
    }

}
